iT邦幫忙

2024 iThome 鐵人賽

DAY 28
0

之前提到為什麼Shellcraft會用到int 0x80,這個其實和System call有關,可以搜尋System call table,不同作業系統和不同位元的系統,System call的參數都不一樣,我們來介紹一下System call。

System call的流程

    1. 準備系統呼叫號碼:每個系統呼叫都有一個唯一的號碼,稱為系統呼叫號碼(System call number),在 X86 Linux 中,這個號碼會被放入暫存器 EAX 當中。
    1. 設置參數:System call可能需要參數,根據呼叫的參數個數,這些參數會被放入暫存器 EBX、ECX、EDX、ESI、EDI或EBP等。
    1. 觸發軟體中斷:在 x86 架構上,System call通常是通過軟體中斷指令 int 0x80 來觸發的,這會將控制權從用戶模式轉移到核心模式,使作業系統核心能夠執行指定的System call。
    1. 核心處理系統呼叫:核心檢查 EAX 中的系統呼叫號碼,並調用對應的核心函數來執行請求的操作。
    1. 返回結果:核心將結果放入 EAX 中,然後從核心模式返回到用戶模式,讓應用程式繼續執行。

實際舉個例子
https://ithelp.ithome.com.tw/upload/images/20241012/20169016kleRffNC31.png

如果一個組合語言這樣寫
https://ithelp.ithome.com.tw/upload/images/20241012/20169016u3JAbw9tYs.png

這個組合語言主要的程式在_start內,它先定義了EAX等於4,在x86 Linux System call中 EAX 為4等於sys_write,如果 EAX 設定為4,那須要定義EBX、ECX和EDX。
下一行EBX定義為1,EBX為1是標準輸出stdout,如果為0則是標準輸入stdin,為2是標準錯誤stderr。
再來定義了ECX是輸出的字串,最後定義EDX為輸出的大小,在System call table當中會將ECX寫成const char *,EDX寫成size_t。
最後就是我們在Shellcraft也有看到的int 0x80,系統呼叫,系統就會將上面的參數通通吃進去,分析後知道我們要做標準輸出,最後輸出出Hello, world!字串。

最後將 EAX 設為1,在System call中 EAX 為1表示sys_exit結束的意思,而 EAX 為1時需要 EBX 參數,所以將 EBX 清空後做系統呼叫。

這就是重要的System call,未來在做Pwn或Reverse都需要知道的知識。


上一篇
【Day-27】Pwn 實戰 - 2
下一篇
【Day-29】ROP ( Return-Oriented Programming )
系列文
從0開始的打Pwn教學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言